# class
# 我们想表达一个长方形
# 我们想表达所有等红灯的汽车的队列
# 我们想表达足球场上的 ⚽️
# 当我们想在 Python 中表达 Python 没有内建的类型的时候：

n = 10          # n 的类型是 int
pi = 3.14       # pi 的类型是 float
name = "Daniel" # name 的类型是 str
# set
# dictionary
# tuple
# list

# 用 class 创建自定义类型
class Rectangle:
    # Rectangle 包含哪些属性 （attributes）
    # 描述一个类型特征的东西
    # width / height
    # 构造函数 / 构造方法
    # __init__ 它有两个作用
    # 1. 定义类型有哪些属性
    # 2. 用于创建这个类型的对象
    def __init__(self, width: float, height: float):
        # 类型的属性是一个类型的第一部分内容
        self.width = width
        self.height = height
    
    # 类型的方法是一个类型的第二部分内容
    # 定义在自定义类型里面的函数，叫做这个类型的方法
    # 方法：类型支持的动作 / 行为
    # 计算矩形面积
    def area(self):
        return self.width * self.height
    # 计算矩形的周长
    def perimeter(self):
        return 2 * (self.width + self.height)

# r1 width = 10 height = 20
r1 = Rectangle(width = 10, height = 20) # 创建了一个 Rectangle 类型的对象 r1
r2 = Rectangle(width = 20, height = 10) # 创建了一个 Rectangle 类型的对象 r2

print(r1.area()) # 调用 r1 的 area 方法
print(r2.area()) # 调用 r2 的 area 方法

print(id(r1))
print(id(r2))

# 创建一个表达日期的类型 Date
class Date:
    def __init__(self, year: int, month: int, day: int):
        self.year = year
        self.month = month
        self.day = day

    # magic method
    # 用于定义打印一个 Date 的时候，输出的样子
    def __repr__(self) -> str:
        return f"{self.year}-{self.month}-{self.day}" # f string

    # 给 Date 添加一个方法，判断它表达的日期是否是一个闰年
    def is_leap_year(self) -> bool:
        if self.year % 4 == 0 and self.year % 100 != 0:
            return True
            
        elif self.year % 400 == 0:
            return True
        
        else:
            return False

    # 把 Date 代表的日期加 1 天
    def increment_day():


curr = Date(year = 2022, month = 8, day = 10)
print(curr) # 2022-8-10
